#include "syssetwidget.h"
#include "ui_syssetwidget.h"


#include "communicationfactory.h"
#include "communicationservice.h"

#include <QSerialPort>
#include <QSerialPortInfo>

#include <QDebug>

#include <QDateTime>
#include <QPixmap>

SysSetWidget::SysSetWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SysSetWidget)
{
    ui->setupUi(this);

    // 创建通信组件
    m_strategy = CommunicationFactory::createStrategy(CommunicationFactory::SERIAL);
    m_protocol = CommunicationFactory::createProtocol(CommunicationFactory::COMPACT);

    // 创建并初始化通信服务
    m_commService = new CommunicationService();

    // 初始化通信服务
    m_commService->init(m_strategy, m_protocol);

    // 连接信号
    // 环境数据
    QObject::connect(m_commService, &CommunicationService::environmentDataReceived,
                     [this](float temp, uint8_t humidity, uint16_t battery) {
        qDebug() << "环境数据更新: 温度=" << temp << "湿度=" << humidity << "电量=" << battery;
        ui->le_temperature->setText(QString("%1℃").arg(temp));  // 更新温度
        ui->le_humidity->setText(QString("%1％").arg(humidity));// 更新湿度
        ui->le_electric->setText(QString("%1%").arg(battery));// 更新电量
    });
    // 考勤打开
    QObject::connect(m_commService, &CommunicationService::rfidReportReceived,
                     [this](QString cardId, uint32_t timestamp, uint8_t status) {
        qDebug() << "RFID打卡: 卡号=" << cardId << "时间=" << timestamp << "状态=" << status;

        emit rxCard(cardId);   // 发送接收到的卡号
    });

    // 心跳包数据
    QObject::connect(m_commService, &CommunicationService::heartbeatReceived,
        [this](float voltage, uint8_t signalStrength) {
            qDebug() << "收到心跳包: 电压=" << voltage << "V, 信号强度=" << signalStrength;

            // ui->le_voltage->setText(QString("%1V").arg(voltage));   // 更新电压
            ui->le_deviceStatus->setText(QDateTime::currentDateTime().toString("yyyy MM dd HH:mm:ss")); // 更新设备在线状态
     });

    // 设备连接状态
    QObject::connect(m_commService, &CommunicationService::connectionStatusChanged,
     [this](bool status) {
         if(status)
            ui->le_deviceIcon->setPixmap(QPixmap(":/img/icon/phone-one.png"));
         else
             ui->le_deviceIcon->setPixmap(QPixmap(":/img/icon/unphone-one.png"));
     });

    // 初始化串口下拉框
    on_btn_update_com_clicked();

    // 初始化波特率组合框（示例）
    ui->comboBox_baud->addItem("9600", QSerialPort::Baud9600);
    ui->comboBox_baud->addItem("115200", QSerialPort::Baud115200);

    // 初始化数据位组合框
    ui->comboBox_databit->addItem("8", QSerialPort::Data8);

    // 初始化校验位组合框
    ui->comboBox_verifybit->addItem("None", QSerialPort::NoParity);

    // 初始化停止位组合框
    ui->comboBox_stopbit->addItem("1", QSerialPort::OneStop);
}

SysSetWidget::~SysSetWidget()
{
    delete ui;

    if(m_commService) {
        // 停止并清理资源
        m_commService->stop();
        m_commService->deleteLater();
    }
}

bool SysSetWidget::onOpenPort()
{
    // 创建通信组件
    if (!m_strategy) {
        m_strategy = CommunicationFactory::createStrategy(CommunicationFactory::SERIAL);
    }

    if(!m_protocol) {
        m_protocol = CommunicationFactory::createProtocol(CommunicationFactory::COMPACT);
    }

    if (m_strategy && m_protocol) {

        // 获取串口参数
        auto PortName = ui->comboBox_com->currentText();// 获取串口名
        auto BaudRate = ui->comboBox_baud->currentData().value<QSerialPort::BaudRate>();// 获取波特率
        auto DataBits = ui->comboBox_databit->currentData().value<QSerialPort::DataBits>();// 获取数据位
        auto StopBits = ui->comboBox_stopbit->currentData().value<QSerialPort::StopBits>();// 获取停止位
        auto Parity   = ui->comboBox_verifybit->currentData().value<QSerialPort::Parity>();// 获取校验位

        // 配置串口参数
        QVariantMap config;
        QString portName = PortName;
        #ifdef Q_OS_WIN // Windows 系统限制 当串口号超过 ​COM9​ 以上串口需通过特殊路径格式访问
            if (portName.startsWith("COM") && portName.mid(3).toInt() > 9) {
            portName = "\\\\.\\" + portName; // 修正路径格式
        }
        #endif

        config["port"] = portName;
        config["baudRate"] = 115200;
        config["dataBits"] = QSerialPort::Data8;
        config["parity"] = QSerialPort::NoParity;
        config["stopBits"] = QSerialPort::OneStop;

        qDebug() << config;

        if(!m_strategy->init(config)) {
            return false;
        }

//        // 初始化通信服务
//        m_commService->init(m_strategy, m_protocol);

        // 启动通信服务
        if (m_commService->start()) {
            qDebug() << "通信服务启动成功";

            // 发送控制命令示例
            m_commService->sendDeviceControl(Protocol::CTRL_RELAY1 | Protocol::CTRL_LED);

            // 发送时间同步命令
            m_commService->sendTimeSync();
        } else {
            qDebug() << "通信服务启动失败";
            return false;
        }
    } else {
        qDebug() << "创建通信组件失败";
        return false;
    }

    return true;
}

void SysSetWidget::on_btn_update_com_clicked()
{
    // 获取所有的可用串口
    ui->comboBox_com->clear();
    foreach(const QSerialPortInfo info, QSerialPortInfo::availablePorts())
    {
        ui->comboBox_com->addItem(info.portName());
    }
}

void SysSetWidget::on_btn_state_clicked()
{
    if(onOpenPort()){
        if(btn_state_switch) {
            // 串口关闭状态
            ui->comboBox_com->setEnabled(true);
            ui->comboBox_baud->setEnabled(true);
            ui->comboBox_databit->setEnabled(true);
            ui->comboBox_stopbit->setEnabled(true);
            ui->comboBox_verifybit->setEnabled(true);

            btn_state_switch = false;
            ui->btn_state->setText("打开");
            ui->btn_state->setIcon(QIcon(":/img/ffo.png"));


            m_commService->stop();
        }
        else {
            // 串口打开状态
            ui->comboBox_com->setEnabled(false);
            ui->comboBox_baud->setEnabled(false);
            ui->comboBox_databit->setEnabled(false);
            ui->comboBox_stopbit->setEnabled(false);
            ui->comboBox_verifybit->setEnabled(false);

            btn_state_switch = true;
            ui->btn_state->setText("关闭");
            ui->btn_state->setIcon(QIcon(":/img/no.png"));
        }
    }
}
